<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 函数： 函数也是一个对象
        // 创建函数对象
        var fun = new Function();
        console.log(typeof fun);
        // 将代码以字符串参数传入构造函数，封装到函数中
        fun = new Function("console.log('我是函数')");
        fun(); // 我是函数

        // 使用函数声明来创建一个函数
        function open() {
            console.log('我是open函数')
        }
        open();

        //使用函数表达式创建函数:  将匿名函数赋值给变量
        var fun2 = function () {
            console.log('我是匿名函数fun2')
        }
        fun2();
        // undefined ： 不写return或者不return值，则返回undefined
        function edit() {
            return;
        }
        var res = edit();
        console.log(res);

        // 实参可以是一个对象，或者函数
        function test(f) {
            console.log(f);
            f();
        }

        function test2(f) {
            console.log(f);
        }
        test(open); // 传入的是函数对象
        test2(open()); // 传入的是函数的返回值
        test(fun2);

        // retrun 结束整个函数，后面的不执行了
        function abc() {
            for (let index = 0; index < 5; index++) {
                if (index == 3) {
                    return;
                }
            }
            console.log("abc函数执行完了~");
        }
        abc();

        // 函数返回值可以是任意类型，比如对象，函数
        function pull() {
            function a() {
                alert("a函数执行")
            }
            return a; // 返回函数
        }
        var p = pull();
        console.log(p);
        p();
        pull()(); // 等同于 p();

        //立即执行函数： 只会执行一次
        (function ok() {
            console.log("立即执行函数~");
        })();
    </script>
</body>

</html>